// 使用axios.create的方式创建axios全局实例的example

import axios from "axios";
// 这里的path是引入一个指定路径的数组 要求请求的路径都在这个数组中
import { path } from "@/assets/song/path.js";
// 以服务的方式来调用loading. Loading 还可以以服务的方式调用
// https://element-plus.gitee.io/zh-CN/component/loading.html#%E8%AE%A9%E5%8A%A0%E8%BD%BD%E7%BB%84%E4%BB%B6%E9%93%BA%E6%BB%A1%E6%95%B4%E4%B8%AA%E5%B1%8F%E5%B9%95
import { ElLoading } from "element-plus";
import { ElMessage } from "element-plus";

let timer;
let loadingInstance;

export function request(config) {
  const instance = axios.create({
    // axios.create使用创建请求时可用的配置选项。只有 url 是必需的。method并不是必须的。
    // 如果没有指定 method，请求默认使用 get 方法。
    // 这里baseURL是网易云音乐的Node接口
    baseURL: `https://music-zlq.vercel.app`,
    timeout: 10000,
    withCredentials: true,
  });

  // 设置请求拦截器
  instance.interceptors.request.use(
    // 请求的所有实例参数都在config
    (config) => {
      // 请求的url如果不在记录的路径数组中时候 就显示下面的loading组件
      if (!path.includes(config.url)) {
        // 以服务的方式来调用loading实例
        loadingInstance = ElLoading.service({
          fullscreen: true,
          spinner: "el-icon-loading",
          text: "拼命加载中...",
          body: true,
          background: "rgba(0,0,0,0.0)",
        });
      }
      // 不同的请求方式
      if (config.method === "post") {
        config.data = {
          ...config.data,
          // Date.parse() 方法解析一个表示某个日期的字符串，并返回从1970-1-1 00:00:00 UTC 到该日期对象（该日期对象的UTC时间）的毫秒数
          // 传过去的数据中包括了当前的时间毫秒数 _t
          _t: Date.parse(new Date().toString()) / 1000,
        };
      } else if (config.method === "get") {
        config.params = {
          _t: Date.parse(new Date().toString()) / 1000,
          ...config.params,
        };
      }
      return config;
    },
    (error) => {}
  );

  // 设置相应拦截器
  instance.interceptors.response.use(
    (response) => {
      // 取消loading图标
      loadingInstance?.close();
      if (response.data.code === "301") {
        localStorage.clear();
        ElMessage({
          message: "请刷新重新登录",
          type: "error",
        });
      }
      return response;
    },
    // 异常捕获
    (error) => {
      clearTimeout(timer);
      timer = setTimeout(() => {
        ElMessage({
          message: "网络异常请重新刷新",
          type: "error",
        });
      }, 1000);
    }
  );

  // 返回axios实例请求config的结果  config中需要有请求的url
  return instance(config);
}
